[XEN] Truncate arithmetic for PERFSTATUS counters to the width of perfc_t.
authorTim Deegan <Tim.Deegan@xensource.com>
Tue, 24 Apr 2007 10:39:13 +0000 (11:39 +0100)
committerTim Deegan <Tim.Deegan@xensource.com>
Tue, 24 Apr 2007 10:39:13 +0000 (11:39 +0100)
Since these are all calculated per-cpu now, a status counter that is
incremented on one cpu and decremented on another will underflow on
the decrement.  When we add the per-cpu values to get the total, if
we don't truncate the sum it will be max-perfc + 1 instead of zero.
Signed-off-by: Tim Deegan <Tim.Deegan@xensource.com>
xen/common/perfc.c

index 11e445a0fc977e9cce00807e1ce2e330a2741d52..535a1c70922911a67d7b864e460f5f800ad7a35b 100644 (file)
@@ -48,6 +48,8 @@ void perfc_printall(unsigned char key)
         case TYPE_S_SINGLE:
             for_each_online_cpu ( cpu )
                 sum += per_cpu(perfcounters, cpu)[j];
+            if ( perfc_info[i].type == TYPE_S_SINGLE ) 
+                sum = (perfc_t) sum;
             printk("TOTAL[%12Lu]", sum);
             if ( sum )
             {
@@ -71,6 +73,8 @@ void perfc_printall(unsigned char key)
                 for ( k = 0; k < perfc_info[i].nr_elements; k++ )
                     sum += counters[k];
             }
+            if ( perfc_info[i].type == TYPE_S_ARRAY ) 
+                sum = (perfc_t) sum;
             printk("TOTAL[%12Lu]", sum);
             if (sum)
             {
@@ -80,6 +84,8 @@ void perfc_printall(unsigned char key)
                     sum = 0;
                     for_each_online_cpu ( cpu )
                         sum += per_cpu(perfcounters, cpu)[j + k];
+                    if ( perfc_info[i].type == TYPE_S_ARRAY ) 
+                        sum = (perfc_t) sum;
                     if ( (k % 4) == 0 )
                         printk("\n%16s", "");
                     printk("  ARR%02u[%10Lu]", k, sum);
@@ -94,6 +100,8 @@ void perfc_printall(unsigned char key)
                     sum = 0;
                     for ( n = 0; n < perfc_info[i].nr_elements; n++ )
                         sum += counters[n];
+                    if ( perfc_info[i].type == TYPE_S_ARRAY ) 
+                        sum = (perfc_t) sum;
                     if ( k > 0 && (k % 4) == 0 )
                         printk("\n%46s", "");
                     printk("  CPU%02u[%10Lu]", cpu, sum);